package com.example.understand_compose1.testcase_activity

import android.Manifest
import android.content.Intent
import android.os.Bundle
import android.os.Environment
import android.provider.Settings
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.understand_compose1.R
import com.example.understand_compose1.databinding.ActivityFetDataStoreExternalBinding
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream

class FetDataStoreExternalActivity : AppCompatActivity() {
    lateinit var binding: ActivityFetDataStoreExternalBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        binding = ActivityFetDataStoreExternalBinding.inflate(layoutInflater)

        setContentView(binding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

//        TODO: 以下代码sdk高版本才有，sdk22没有
//        if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//            // 显示为什么需要这个权限的解释
//        } else {
//            // 直接打开应用设置页面
//            val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
//            startActivity(intent)
//        }

    }

    fun writeexternal(view: View) {

        // 1. 判断外部存储是否已经挂载
        val externalStorageState = Environment.getExternalStorageState()
        if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
            // 2. 写入数据
            val externalStorageDirectory = Environment.getExternalStorageDirectory()

            val file = File(externalStorageDirectory, "out.txt")

            Log.d("TAG", "writeexternal: 操，服了，傻逼android管那么严格干什么")
            // BUG: 顶多运行到这里就闪退了 TODO:怎么办
            val fileOutputStream = FileOutputStream(file)

            fileOutputStream.write("Hello world".toByteArray())

            fileOutputStream.close()
            Toast.makeText(this, "写入外部存储成功", Toast.LENGTH_SHORT).show()
        }
    }

    fun readexternal(view: View) {
        // 1. 判断外部存储是否已经挂载
        val externalStorageState = Environment.getExternalStorageState()
        if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
            Log.d("TAG", "readexternal: 操，连读取都不能")

            // 2. 读出数据
            val externalStorageDirectory = Environment.getExternalStorageDirectory()

            val file = File(externalStorageDirectory, "out.txt")

            val fileInputStream = FileInputStream(file)

            val buffer = byteArrayOf(fileInputStream.available().toByte())

            fileInputStream.read(buffer)
            fileInputStream.close()

            Toast.makeText(this, "读取外部数据成功", Toast.LENGTH_SHORT).show()

        }

    }
}

/*
在 Android 开发中，访问外部存储需要动态请求存储权限。从 Android 6.0（API 级别 23）开始，用户需要在应用运行时明确授权存储权限。对于 Android SDK 34（即 Android 13），这一要求仍然适用，并且权限模型已经发生了变化，引入了分区存储和更多细粒度的权限控制。

如果您的应用在尝试写入外部存储时崩溃，并且您希望弹出权限配置，您需要确保您的应用正确地请求了存储权限，并且处理了用户的授权结果。以下是请求存储权限的步骤：

### 1. 在 AndroidManifest.xml 中声明权限

对于 Android 10（API 级别 29）及以上版本，如果您的应用针对的是 Android 10 或更高版本，并且需要访问整个外部存储，您需要在 `AndroidManifest.xml` 中声明 `requestLegacyExternalStorage` 属性：

```xml
<application
    android:requestLegacyExternalStorage="true"
    ...>
    ...
</application>
```

请注意，`requestLegacyExternalStorage` 是一个临时解决方案，允许应用使用旧的存储模型。Google 建议使用分区存储（Scoped Storage），这要求应用只请求它需要访问的文件和目录的权限。

### 2. 动态请求存储权限

在应用运行时，您需要动态请求存储权限。以下是请求写入外部存储权限的示例代码：

```kotlin
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    // 请求权限
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_CODE)
} else {
    // 权限已被授予，可以执行写入操作
}
```

在这里，`REQUEST_CODE` 是您定义的一个整型常量，用于识别权限请求。

### 3. 处理权限请求结果

您需要在 `Activity` 中重写 `onRequestPermissionsResult` 方法来处理用户的授权结果：

```kotlin
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限被授予，可以执行写入操作
        } else {
            // 权限被拒绝，可以向用户解释为什么需要这个权限
        }
    }
}
```

### 4. 弹出权限配置

如果您希望在用户拒绝权限后提供一个设置界面，让用户可以手动开启权限，可以使用 `AppSettingsDialog`：

```kotlin
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    // 显示为什么需要这个权限的解释
} else {
    // 直接打开应用设置页面
    val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
    startActivity(intent)
}
```

请注意，`ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION` 是 Android 10（API 级别 29）引入的新 Intent action，用于请求所有文件访问权限。

确保您的应用正确处理了存储权限的请求和用户反馈，这有助于避免应用闪退，并提供更好的用户体验。

 */